﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ElCharro01.Models;

namespace ElCharro01.Areas.User.Controllers
{
    public class CartController : Controller
    {
        private Entities db = new Entities();

        public ActionResult CartSummary()
        {
            int cartId = (int)Session["cartId"];
            int ItemsInCart = 0;
            if (cartId != 0)
            {
                Cart cart = db.CartSet.Single(c => c.Id == cartId);
                List<CartDetail> CartDetailList = cart.CartDetail.ToList();

                foreach (CartDetail cartDetail in CartDetailList)
                {
                    ItemsInCart = ItemsInCart + cartDetail.Quantita;

                }
                ViewBag.ItemsInCart = ItemsInCart;
                return View(db.CartSet.Single(c => c.Id == cartId));
            }
            else
                return View();
        }
        
        [HttpPost]
        public ActionResult AddToCart(int variantId, int quantity)
        {
            int CartId;
            CartDetail CartDetail = new CartDetail();
            Variant variant = db.VariantSet.Single(v => v.ID == variantId);


            // se l'utente ancora non ha un carrello ne creo uno
            if ((int)Session["cartId"] == 0)
            {
                //creo il nuovo carrello
                Cart cart = new Cart();
                cart.DataCreazione = DateTime.Now;
                cart.Totale = 0;
                db.CartSet.AddObject(cart);
                db.SaveChanges();
                CartId = cart.Id;
                Session["cartId"] = CartId;    //setto il valore di Session["cartId"] con l'id del carrello appena creato

                // se l'utente ha effettuato il login associo il carrello all'utente
                int userid = (int)Session["UserId"];
                if (userid != 0)
                {
                    Customer customer = new Customer();
                    customer = (Customer)db.UserSet.Single(c => c.ID == userid);
                    customer.Cart = cart;
                    db.UserSet.Attach(customer);
                    db.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified);
                    db.SaveChanges();
                }
            }
            else
            {
                CartId = (int)Session["cartId"];
            }

            // associo la variant al carrello attraverso la classe CartDetail

            /*controllo se sto aggiungendo una variante che avevo già aggiunto al carrello, in tal caso vado a modificare la
            quantità sommando quelle ordinate in questo momento con quelle già ordinate*/

            if (db.CartDetailSet.Where(c => c.Cart.Id == CartId && c.Variant.ID == variantId).ToList().Count() == 1)
            {
                CartDetail = db.CartDetailSet.Single(c => c.Cart.Id == CartId && c.Variant.ID == variantId);
                // controllo che l'utente non ordini una quantità maggiore delle disponibilità di magazzino
                if (CartDetail.Quantita + quantity <= variant.InStock)
                {
                    CartDetail.Quantita = CartDetail.Quantita + quantity;
                    CartDetail.Totale = CartDetail.Totale + variant.PrezzoUnitario;
                }
                else
                {
                    CartDetail.Quantita = variant.InStock;
                    CartDetail.Totale = variant.PrezzoUnitario * variant.InStock;
                }

                db.ObjectStateManager.ChangeObjectState(CartDetail, EntityState.Unchanged);
                db.CartDetailSet.Attach(CartDetail);
                db.ObjectStateManager.ChangeObjectState(CartDetail, EntityState.Modified);
                db.SaveChanges();
            }
            /* altrimenti creo un nuovo CartDetail*/
            else
            {
                CartDetail.Quantita = quantity;
                CartDetail.Variant = variant;
                CartDetail.Totale = quantity * variant.PrezzoUnitario;
                CartDetail.Cart = db.CartSet.Where(c => c.Id == CartId).Single();
                db.CartDetailSet.AddObject(CartDetail);
                db.SaveChanges();
            }

            //aggiorno il totale nel carrello sommando i totali parziali contenuti in ogni CartDetail
            Cart Cart = db.CartSet.Single(c => c.Id == CartId);
            Cart.Totale = 0;
            List<CartDetail> CartDetailList = Cart.CartDetail.ToList();

            foreach (CartDetail cartDetail in CartDetailList)
            {
                Cart.Totale = Cart.Totale + cartDetail.Totale;
            }

            db.ObjectStateManager.ChangeObjectState(Cart, EntityState.Unchanged);
            db.CartSet.Attach(Cart);
            db.ObjectStateManager.ChangeObjectState(Cart, EntityState.Modified);
            db.SaveChanges();

            return RedirectToAction("Details", "Variant", new { id = variantId });

        }

        //
        // GET: /User/Cart/Details/5

        public ViewResult Details()
        {
            Cart cart = new Cart();
            int cartID = (int)Session["cartId"];
            if (cartID != 0)
            {
                cart = db.CartSet.Include("CartDetail").Include("Customer").Single(c => c.Id == cartID);

            }

            return View(cart);
        }

        //
        // GET: /User/Cart/Create

        public int Create()
        {
            Cart Cart = new Cart();
            Cart.DataCreazione = DateTime.Now;
            db.CartSet.AddObject(Cart);
            db.SaveChanges();
            return Cart.Id;
        }


        public ActionResult Edit(int id)
        {
            Cart cart = db.CartSet.Single(c => c.Id == id);
            return View(cart);
        }

        [HttpPost]
        public ActionResult Edit(Cart cart)
        {
            if (ModelState.IsValid)
            {
                db.CartSet.Attach(cart);
                db.ObjectStateManager.ChangeObjectState(cart, EntityState.Modified);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(cart);
        }


        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}